day08b (データ構造の移動)
コミットするの忘れてた
SetCSSSで止まってしまう なぜ?
SetupSegments()を読んでなかった
呼んだら悪化した(止まって、しばらく後に強制再起動するようになった)
segment.cppのdesc.bits.limit_high = (limit >> 16) & 0xfu; を '& 0xffffu って書いてた
segment.hppのDescriptorType type : 4;で、:4を忘れてた
printkが間に合ってないだけで、SetCSSSは動いてそう
動いてませんでした・・・
無限ループをちまちま書いて、原因がわかった
code:asmfunc.asm
SetCSSS:
push rbp
mov rbp, rsp
mov ss, si
.tmp:
hlt
jmp .tmp
mov rax, .next
...
このときにフリーズ
つまり、原因はmov ss, siということ
ということは第2引数がおかしい?(siはrsiの下位16bitで、System V AMD64 ABIでは第2引数に使われるため)
asmfunc.asmのせいではない(コピペして確かめた)
原因はこれ↓の場所
code:main.cpp
const uint16_t kernel_cs = 1 << 3;
const uint16_t kernel_ss = 2 << 3;
これはSetupSegmentsの後に記述しなければいけなかったらしかったが、「関数呼び出しはまとめて書いたほうがええやろ~」というてきとうなお気持ちで書いたのが駄目だった
と思ったけど違うらしい?何もして無いのに治った
ほんとうにわからない
何かしらのビルドができてなかったのかなあ(make cleanしてたらもっと早く解決してた可能性?)
あるとすれば、segment.hpp(:4を忘れてたのを書き直した 上参照)
ログ見た感じそうらしい(治った時と見られるビルドでsegment.cppがコンパイルされてたこと、Gitにsegment.cppのaddしてない変更が乗っていたことから)
Makefile見直さないといけない
-include $(DEPS)のSが抜けてた
MikanOSとビルドディレクトリが違うので、sedで置き換え後の文字列が違った
ちなみにこれはどういう意味なんだろうか